package game.data;

/**
 * 击中数据
 */
class HitData {
	/**
	 * 击中后产生的击退效果，对应X轴
	 */
	public var hitMoveX:Float = 0;

	/**
	 * 击中后产生的击飞效果，对应Y轴
	 */
	public var hitMoveY:Float = 0;

	/**
	 * 击中事件，当击中时会触发的事件
	 */
	public var eventTag:String = "";

	/**
	 * 卡帧持续时间（如果没有填，则读取`stopFrameTimeEnemy`）
	 */
	public var stopFrameTimeSelf:Float = -1;

	/**
	 * 攻击间隔，如果值为`0`则只能攻击1次
	 */
	public var attackInterval:Float = 0;

	/**
	 * 击中的时间，用于计算攻击间隔使用
	 */
	public var hitedTime:Float = 0;

	/**
	 * 碰撞有效时间
	 */
	public var liveTime:Float = 0;

	/**
	 * 最大攻击次数，如果设置为-1，则可以无限攻击
	 */
	public var maxTimes:Int = 1;

	/**
	 * 卡帧持续时间
	 */
	public var stopFrameTimeEnemy:Float = 0;

	/**
	 * 震动强度
	 */
	public var shakeIntensity:Float = 0;

	/**
	 * 震动持续时间
	 */
	public var shakeDuration:Float = 0;

	/**
	 * 震动频率
	 */
	public var shakeFrequency:Float = 10;

	/**
	 * 是否应用在角色卡帧中，默认为`true`，如果为`false`，则仅卡帧特效，而不会影响到英雄
	 */
	public var applyRoleStopFrame:Bool = true;

	/**
	 * 击中后产生僵直时间
	 */
	public var stiffenTime:Float = -1;

	/**
	 * 击中时触发的音频
	 */
	public var sound:String = null;

	/**
	 * 击中时产生的击中特效，如果没有则使用默认的击中特效
	 */
	public var hitEffectId:String = null;

	/**
	 * 全局的重击特效ID
	 */
	public var hitBlowEffectId:String = null;

	/**
	 * 击中敌人闪缩的颜色值
	 */
	public var hitColor:Int = 0xffffff;

	/**
	 * 是否为重击攻击，如果为重击攻击，会产生强力的卡帧效果，并会造成击飞效果
	 */
	public var isBlow:Bool = false;

	/**
	 * 是否破坏防御
	 */
	public var isDestroyDefense:Bool = false;

	/**
	 * 碰撞体产生的坐标点X
	 */
	public var createX:Float = 0;

	/**
	 * 碰撞体产生的坐标点Y
	 */
	public var createY:Float = 0;

	/**
	 * 碰撞体产生得方向
	 */
	public var createDirection:Float = 1;

	/**
	 * 该攻击是否被防御
	 */
	public var isDefense:Bool = false;

	/**
	 * 伤害系数
	 */
	public var damageScale:Float = 1;

	/**
	 * 攻击类型
	 */
	public var attackType:AttackType = NORMAL;

	public function new() {}

	/**
	 * 克隆击中效果
	 * @return HitData
	 */
	public function clone():HitData {
		var hitData:HitData = new HitData();
		for (key in Reflect.fields(this)) {
			Reflect.setProperty(hitData, key, Reflect.getProperty(this, key));
		}
		return hitData;
	}

	/**
	 * 更新碰撞体产生的坐标点
	 * @param x 坐标X
	 * @param y 坐标Y
	 */
	public function updateCreatePoint(x:Float, y:Float, scaleX:Float):Void {
		createX = x;
		createY = y;
		createDirection = scaleX > 0 ? 1 : -1;
	}
}
